# docker service COMMAND

集群服务管理命令,在集群manager节点上执行

# 1 管理服务命令

  • docker service create 创建一项新服务
  • docker service inspect 显示一项或多项服务的详细信息
  • docker service logs 获取服务或任务的日志
  • docker service ls 列出服务
  • docker service ps 列出一项或多项服务的任务
  • docker service rm 删除一项或多项服务
  • docker service rollback 还原服务配置的更改
  • docker service scale 扩展一个或多个复制服务
  • docker service update 更新服务

# 2 管理服务命令详解

# 2.1 docker service create
  • 格式

    # docker service create [options] image [command] [arg...]
    # eg:
    docker service create --name redis redis:6.0.5
    docker service create --mode global --name redis2 redis:6.0.5
    docker service ls
    # 使用--with-registry-auth从私有仓库拉取image生成service
    docker login docker.mofar.top
    
    docker service create \
    --with-registry-auth \
    --name web-portal \
    docker.mofar.top/dss/web-portal:3.0.0
    #使用--replicas创建多副本任务的服务
    docker service create --name redis --replicas=3 redis:6.0.5
    # --secret default secrets are located in `/run/secrets` 
    docker service create --name redis --secret secret.json redis:6.0.5
    
    docker service create --name redis \
    --secret source=ssh-key,target=ssh \
    --secret source=app-key,target=app,uid=1000,gid=1001,mode=0400 \
    redis:6.0.5
    # --config default amount `/`
    docker service create --name redis --config redis-conf redis:6.0.5
    
    docker service create --name redis \
    --config source=redis-conf,target=/etc/redis/redis.conf,mode=0400 \
    redis:6.0.5
    #rolling update policy 更新策略,执行docker service update redis时,每次最多同时更新2个任务,间隔10s
    docker service create \
    --name redis \
    --replicas 13 \
    --update-delay 10s \
    --update-parellelism 2 \
    redis:6.0.5
    # -e,--env 
    docker service create \
    --name redis \
    --replicas 3 \
    --env MAVEN_HOME=/usr/local/share/maven \
    redis:6.0.5
    
    docker service create \
    --name redis \
    --replicas 3 \
    --env JAVA_HOME=/usr/local/jdk8 \
    --env MAVEN_HOME=/usr/local/share/maven \
    redis:6.0.5
    # --hostname
    docker service create --name redis --hostname myredis redis:6.0.5
    # -l,--label
    docker service create \
    --name redis \
    --label docker.mofar.top="docker" \
    --label nexus.mofar.top=nexus \
    redis:6.0.5
    # --mount
    # 如果多个任务在一个节点上,可能会出现写入冲突情况,卷会持久化
    docker service create \
    --name nginx \
    --replicas 3 \
    --mount type=volume,source=nginx-conf,destination=/etc/nginx/conf,volume-label="color=red",volume-label="shape=round" \
    nginx:alpine
    # 每个任务都生成一个新卷,卷会跟随任务完成后自动删除
    docker service create \
    --name nginx \
    --replicas 3 \
    --mount type=volume,destination=path/in/container \
    nginx:alpine
    # dst|destination|target is same, src|source is same,ro|readonly is same
    docker service create \
    --name nginx \
    --mount type=bind,src=/path/to/host,target=/path/in/container \
    nginx:alpine
    # --mode replicated(default)|global
    docker service create \
    --name redis \
    --mode global \
    redis:6.0.5
    #--constraint 指定约束表达式(设置任务调度)
    docker service create \
    --name redis \
    --constaint node.id==2ivku8v2gvtg4 \
    --constaint node.hostname!=node-2 \
    --constaint node.role==manager|worker \
    --constaint node.platform.os==windows|linux \
    --constaint node.platform.arch==x86_64 \
    --constaint node.labels.xxx==bbb \
    --constaint engine.labels.xxx==ccc \
    redis:6.0.5
    
    docker service create \
    --name nginx \
    --constaint node.labels.region=east \
    nginx:alpine
    
    # --reserve-memory --limit-memory 预订|限制内存
    docker service create --name redis --reserve-memory=4GB redis:6.0.5
    docker service create --name redis --limit-memory=4GB redis:6.0.5
    #--replicas-max-per-node 每个节点任务副本数
    docker service create \
    --name nginx \
    --replicas 3 \
    --replicas-max-per-node 1 \
    --placement-pref 'spread=node.labels.datacenter' \
    nginx:alpine
    # --network 附加一个服务到存在的网络
    docker network create --driver overlay my-network
    
    docker sevice create \
    --name nginx \
    --replicas 3 \
    --network my-network \
    nginx
    # -p,--publish
    docker service create --name nginx --replicas 3 -p 8080:80 nginx
    docker service create --name ngixn --replicas 3 --pulbish published=8080,target=80 nginx
    # 使用模板参数,
    # 支持选项 --hostname,--mount,--env 
    # 有效选项值:.Service.ID|.Service.Name|.Service.Labels|.Node.ID|.Node.Hostname|.Task.ID|.Task.Name|.Task.Slot
    docker service create \
    --name nginx \
    --hostname="{{.Service.Name}}-{{.Node.Hostname}}-{{.Node.ID}}"
    nginx
    
    # running as a job,two modes:replicated-job|global-job
    docker service create \
    --name myjob \
    --mode global-job \
    bash "true"
    
    docker service create \
    --name myjob \
    --mode replicated-job \
    --replicas 13 \
    --max-concurrent 2 \
    bash "true"
    
  • 选项

    1. --name
    2. -d,--detach
    3. -w,--workdir
    4. -e,env 设置环境变量
    5. -p,publish
    6. -t, tty
    7. --replicas
    8. --constraint 安置约束
    9. --with-registry-auth 将注册验证信息发送给集群代理(下载私仓镜像用到)
    10. --config 指定向服务公开的配置,即向容器引入配置
    11. --env-file 从文件中读取环境变量
    12. --host 设置host-to-ip映射,(host:ip)
    13. --hostname 指定容器的主机名
    14. -l,label 定义label,key=val
    15. --limit-cpu
    16. --reserve-cpu
    17. --limit-memory
    18. --reserve-memory
    19. --network 附加到已有网络
    20. --replicas-max-per-node
    21. -q,quiet
    22. --max-concurrent
    23. --read-only
    24. --mode service mode(replicated(default)|global|replicated-job|global-job)
    25. --log-driver
    26. --log-opt
    27. --health-cmd 健康检查的命令
    28. --health-interval
    29. --health-retries
    30. --health-start-period
    31. --health-timeout
    32. --no-healthcheck
    33. --dns
    34. --dns-option
    35. --dns-search
    36. --endpoint-mode 终端模式(vip(default)|dnsrr)
    37. --ulimit
    38. --secret
    39. -u,--user username or UID(format:<name|uid>[:<group|gid>])
    40. --group 为容器设置附加用户组
# 2.2 docker service inspect
  • 格式

    # 显示指定服务的详细信息
    # docker service inspect [options] SERVICE [SERVICE...]
    docker service inspect nginx
    # == docker service inspect --f pretty nginx
    docker service inspect --pretty nginx 
    docker service inspect -f {{.Spec.Mode.Replicated.Replicas}} nginx
    
  • 选项

    1. -f,--format 格式化输出,
    2. --pretty 人性化方式打印信息,默认json方式打印
# 2.3 docker service logs
  • 格式

    #获取服务或任务的日志
    # docker service logs [OPTIONS] SERVICE_ID|SERVICE_NAME|TASK_ID
    docker service logs -f --tail 10 nginx
    
    
  • 选项

    1. -f,--follow 跟踪日志输出
    2. --tail <n> 显示多少行,实际显示的行数:replicas*n,default "all"
    3. --no-trunc 不截断输出
    4. --details
    5. --no-resolve 不把ID映射成name输出
    6. --no-task-ids 不输出任务ID
    7. --raw 原始格式输出
    8. --since 从几时的日志开始输出,可以是绝对日期时间(2021-01-12T13:13:12z) 或相对时间(42m,即42分钟内)
    9. -t,--timestamps 显示日期时间
# 2.4 docker service ls
  • 格式

    # 列出所有服务
    # docker service ls [OPTIONS]
    docker service ls
    #只显示ids
    docker service ls -q
    #filter
    docker service ls -f "id=0j0s"
    docker service ls --filter label=project
    docker service ls --filter name=redis
    #format
    docker service ls --format "{{.ID}}: {{.Mode}} {{.Replicas}}"
    
  • 选项

    1. -f, --filter 过滤输出,支持的过滤器有`id|label|mode|name``
    2. --format 格式化输出,支持.ID|.Name|.Mode|.Replicas|.Image|.Ports
    3. -q,--quiet only dispaly ids
# 2.5 docker service ps
  • 格式

    #显示一个或多个服务中的任务列表
    #docker service ps [OPTIONS] SERVICE [SERVICE...]
    docker service ps nginx
    
  • 选项

    1. -f,--filter
    2. --format
    3. no-resolve
    4. no-trunc
    5. -q,--quiet
# 2.6 docker service rollback
  • 格式

    #回滚服务配置
    # docker service rollback [OPTIONS] SERVICE
    docker service create --name nginx --replicas 3 -p 8080:80 nginx:alpine
    docker service scale nginx=4
    docker service rollback nginx
    
  • 选项

    1. -d,--detach
    2. -q,quiet
# 2.7docker service rm
  • 格式

    # remove one or more services
    # docker service rm SERVICE [SERVICE...]
    docker service rm nginx redis
    
  • 选项

# 2.8 docker service scale
  • 格式

    # docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
    docker service scale nginx=5 redis=3
    
  • 选项

# 2.9 docker service update
  • 格式

    # 更新服务配置
    # docker service update [OPTIONS] SERVICE
    docker service update --replicas 3 nginx
    docker service update --replicas=5 nginx
    docker service update --limit-cpu 2 nginx
    # 并行2个2个更新任务,间隔30s
    docker service update --force --update-parallelism 2 --update-delay 30s nginx
    # mount update(mount-add|mount-rm)
    docker service create \
    --name nginx \
    --mount type=volume,source=test-data,target=/path/in/container \
    nginx
    
    docker service update \
    --mount-add type=volume,source=other-data,target=/other/path \
    nginx
    
    docker service update --mount-rm /other/path nginx
    #published ports(publish-add|pubish-rm),删除时,指定target端口即可
    docker service update \
    --publish-add publish=8080,target=80 \
    nginx
    
    docker service update \
    --publish-add 8080:80 \
    nginx
    
    docker service update \
    --publish-rm publish-rm published=8080,target=80 \
    nginx
    
    docker service update \
    --publish-rm publish-rm 80 \
    nginx
    # add or remove network(network-add|network-rm)
    docker service update \
    --network-rm my-network \
    --network-add name=my-network,alias=web1 \
    nginx
    # rollback
    docker service update --replicas=5 nginx
    docker service update --rollback nginx
    docker service update \
    --rollback \
    --update-delay 0s \
    nginx
    # secrets(secret-add|secret-rm)
    docker service update \
    --secret-add source=ssh-2,target=ssh-2 \
    --secret-rm ssh-1 \
    nginx
    
  • 选项

    1. --args 服务命令参数
    2. --cap-add 增加linux能力
    3. --cap-drop 删除linux能力
    4. --config-add 增加或更新服务的一个配置文件
    5. --config-rm 删除一个配置文件
    6. --constraint-add 增加或更新约束
    7. --constraint-rm 删除结束
    8. --container-label-add 增加或更新容器标签
    9. --container-label-rm 通过key删除容器的标签
    10. -d, --detach 立即退出而不待待服务完成
    11. --dns-add 增加或更新自定义的dns服务
    12. --dns-rm 删除自定义的dns服务
    13. --dns-option-add 增加或更新dns选项
    14. --dns-option-rm 删除dns选项
    15. --dns-search-add 增加dns搜索域
    16. --dns-search-rm 删除dns搜索域
    17. --endpoint-mode 端点模式(vip|dnsrr)
    18. --entrypoint `重写镜像的默认入口命令(ENTRYPOINT)
    19. --env-add 增加或更新环境变量
    20. --env-rm 删除环境变量
    21. --force 即使没有更改也强制更新
    22. --generic-resource-add 增加通用
    23. --generic-resource-rm 删除通用资源
    24. --group-add 增加额外的附加用户组
    25. --group-rm 从容器中删除之前增加的附加用户群组
    26. -health-cmd 健康检查运行的命令
    27. --health-interval 健康检查的频率(ms|s|m|h)
    28. --health-retries 连接失败多少次报告不健康
    29. --health-start-period 在对不稳定的重试计数之前容器初始化的开始时间 (ms|s|m|h)
    30. --health-timeout 允许一次健康检查的最大时间(ns|us|ms|s|m|h)
    31. --host-add 增加自定义host-to-ip映射(host:ip)
    32. --host-rm 删除自定义host-to-ip映射(host:ip)
    33. --hostname 指定容器的主机名
    34. --image 更新服务镜像,可以用来升级
    35. --init 在每个服务容器内使用一个init来转发信号和获取进程
    36. --isolation 服务容器的隔离模式
    37. --label-add 增加或更新一个服务label
    38. --label-rm 通过key来删除label
    39. --limit-cpu CPU限制数
    40. --limit-memory 最大的内存限制
    41. --limit-pids 限制最大的进程数(默认0,无限制)
    42. --log-driver 服务的日志驱动程序
    43. --log-opt 日志驱动程序选项
    44. --max-concurrent 并发运行的作业任务数(默认等于--replicas)
    45. --mount-add 增加或更新一个挂载
    46. --mount-rm 通过target路径删除挂载
    47. --network-add 增加网络
    48. --network-rm 删除网络
    49. --no-healthcheck 禁用容器指定的健康检查
    50. --no-resolve-image 不查询仓库来解析镜像摘要和支持的平台
    51. --placement-pref-add 增加展示位置首选项
    52. --placement-pref-rm 删除展示位置首选项
    53. --publish-add 增加映射端口
    54. --publish-rm 通过target端口删除已映射出来的端口
    55. -q,--quiet 抑制进度输出
    56. --read-only 将容器的根文件系统挂载为只读
    57. --replicas 任务数
    58. --replicas-max-per-node 每个节点的任务数
    59. --reserve-cpu 预留cpu
    60. --reserve-memory 保留内存
    61. --restart-condition 满足条件重启("none"|"on-failure"|"any")
    62. --restart-delay 重启尝试的时间间隔(ns|us|ms|s|m|h)
    63. --restart-max-attempts 重启的最大尝试次数
    64. --restart-window 用于评估重启策略的窗口(ns|us|ms|s|m|h),不明白
    65. --rollback 回滚到前一个配置
    66. --rollback-delay 回滚任务间隔(ns|us|ms|s|m|h)
    67. --rollback-failure-action 回滚失败后的动作("pause"|"continue")
    68. --rollback-max-failure-ratio 回滚期间允许的故障率
    69. --rollback-monitor 每个任务回滚后监控失败的持续时间(ns|us|ms|s|m|h)
    70. --rollback-order 回滚顺序("start-first"|"stop-first")
    71. --rollback-parallelism 回滚并行最大任务数(0是全部一次性回滚)
    72. --secret-add 增加secret
    73. --secret-rm 删除secret
    74. --stop-grace-period 强制杀死一个容器前的待待时间(ns|us|ms|s|m|h)
    75. --stop-signal 停止容器的信号
    76. --sysctl-add 增加一个sysctl选项
    77. --sysctl-rm 删除一个sysctl选项
    78. -t,--tty 分配一个伪终端
    79. --ulimit-add 增加一个ulimit的选项
    80. --ulimit-rm 删除一个ulimit的选项
    81. --update-delay 更新的时间间隔
    82. --update-failure-action 更新失败后采取的动作("pause"|"continue"|"rollback")
    83. --update-max-failure-ratio 更新期间允许的故障率
    84. --update-monitor 每个任务更新后监控失败的持续时间
    85. --update-order 更新顺序("start-first"|"stop-first")
    86. update-parallelism 更新并行最大任务数
    87. -u,--user 用户或用户ID(format:<name|uid>[:<group|gid>])
    88. --with-registry-auth 发送注册表的验证信息到集群代理(swarm agent)
    89. -w, --workdir 容器工作目录